home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / taito_l.c < prev    next >
C/C++ Source or Header  |  2000-05-25  |  7KB  |  300 lines

  1. #include "driver.h"
  2. #include "generic.h"
  3.  
  4.  
  5. extern unsigned char *taitol_rambanks;
  6. extern int taitol_bg18_deltax, taitol_bg19_deltax;
  7.  
  8. static struct tilemap *bg18_tilemap;
  9. static struct tilemap *bg19_tilemap;
  10. static struct tilemap *ch1a_tilemap;
  11.  
  12. static int cur_ctrl = 0;
  13. static int cur_bankg = 0;
  14. static int bankc[4];
  15.  
  16.  
  17.  
  18. /***************************************************************************
  19.  
  20.   Callbacks for the TileMap code
  21.  
  22. ***************************************************************************/
  23.  
  24. static void get_bg18_tile_info(int tile_index)
  25. {
  26.     int attr = taitol_rambanks[2*tile_index+0x4000+1];
  27.     int code = taitol_rambanks[2*tile_index+0x4000]|((attr&0x03)<<8)|(bankc[(attr&0xc)>>2]<<10);
  28.  
  29.     SET_TILE_INFO (0, code, (attr & 0xf0)>>4);
  30. }
  31.  
  32. static void get_bg19_tile_info(int tile_index)
  33. {
  34.     int attr = taitol_rambanks[2*tile_index+0x5000+1];
  35.     int code = taitol_rambanks[2*tile_index+0x5000]|((attr&0x03)<<8)|(bankc[(attr&0xc)>>2]<<10);
  36.  
  37.     SET_TILE_INFO (0, code, (attr & 0xf0)>>4);
  38. }
  39.  
  40. static void get_ch1a_tile_info(int tile_index)
  41. {
  42.     int attr = taitol_rambanks[2*tile_index+0x6000+1];
  43.     int code = taitol_rambanks[2*tile_index+0x6000]|((attr&0x01)<<8)|((attr&0x04)<<7);
  44.  
  45.     SET_TILE_INFO (2, code, (attr & 0xf0)>>4);
  46. }
  47.  
  48.  
  49.  
  50. /***************************************************************************
  51.  
  52.   Start the video hardware emulation.
  53.  
  54. ***************************************************************************/
  55.  
  56. int taitol_vh_start(void)
  57. {
  58.     int i;
  59.  
  60.     bg18_tilemap = tilemap_create(get_bg18_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,8,8,64,32);
  61.     bg19_tilemap = tilemap_create(get_bg19_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,     8,8,64,32);
  62.     ch1a_tilemap = tilemap_create(get_ch1a_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,8,8,64,32);
  63.  
  64.     if (!ch1a_tilemap || !bg18_tilemap || !bg19_tilemap)
  65.         return 1;
  66.  
  67.     bankc[0] = bankc[1] = bankc[2] = bankc[3] = 0;
  68.     cur_ctrl = 0;
  69.  
  70.     bg18_tilemap->transparent_pen = 0;
  71.     ch1a_tilemap->transparent_pen = 0;
  72.  
  73.     for (i=0;i<256;i++)
  74.         palette_change_color(i, 0, 0, 0);
  75.  
  76.     tilemap_set_scrollx(ch1a_tilemap, 0, 8);
  77.  
  78.     return 0;
  79. }
  80.  
  81.  
  82.  
  83. /***************************************************************************
  84.  
  85.   Memory handlers
  86.  
  87. ***************************************************************************/
  88.  
  89. WRITE_HANDLER( taitol_bankg_w )
  90. {
  91.     if (data != cur_bankg)
  92.     {
  93.         int i;
  94.         for(i=0;i<4;i++)
  95.             bankc[i] = bankc[i] + (data - cur_bankg)*4;
  96.         cur_bankg = data;
  97.  
  98.         tilemap_mark_all_tiles_dirty(bg18_tilemap);
  99.         tilemap_mark_all_tiles_dirty(bg19_tilemap);
  100.     }
  101. }
  102.  
  103. READ_HANDLER( taitol_bankg_r )
  104. {
  105.     return cur_bankg;
  106. }
  107.  
  108. WRITE_HANDLER( taitol_bankc_w )
  109. {
  110.     if (bankc[offset] != data + cur_bankg*4)
  111.     {
  112.         bankc[offset] = data + cur_bankg*4;
  113. //        logerror("Bankc %d, %02x (%04x)\n", offset, data, cpu_get_pc());
  114.  
  115.         tilemap_mark_all_tiles_dirty(bg18_tilemap);
  116.         tilemap_mark_all_tiles_dirty(bg19_tilemap);
  117.     }
  118. }
  119.  
  120. READ_HANDLER( taitol_bankc_r )
  121. {
  122.     return bankc[offset] - cur_bankg*4;
  123. }
  124.  
  125.  
  126. WRITE_HANDLER( taitol_control_w )
  127. {
  128.     if (cur_ctrl != data) {
  129. //        logerror("Control Write %02x (%04x)\n", data, cpu_get_pc());
  130.  
  131.         cur_ctrl = data;
  132.     }
  133. }
  134.  
  135. READ_HANDLER( taitol_control_r )
  136. {
  137. //    logerror("Control Read %02x (%04x)\n", cur_ctrl, cpu_get_pc());
  138.     return cur_ctrl;
  139. }
  140.  
  141. void taitol_chardef14_m(int offset)
  142. {
  143.     decodechar(Machine->gfx[2], offset/32,     taitol_rambanks,
  144.                Machine->drv->gfxdecodeinfo[2].gfxlayout);
  145.     tilemap_mark_all_tiles_dirty(ch1a_tilemap);
  146. }
  147.  
  148. void taitol_chardef15_m(int offset)
  149. {
  150.     decodechar(Machine->gfx[2], offset/32+128, taitol_rambanks,
  151.                Machine->drv->gfxdecodeinfo[2].gfxlayout);
  152.     tilemap_mark_all_tiles_dirty(ch1a_tilemap);
  153. }
  154.  
  155. void taitol_chardef16_m(int offset)
  156. {
  157.     decodechar(Machine->gfx[2], offset/32+256, taitol_rambanks,
  158.                Machine->drv->gfxdecodeinfo[2].gfxlayout);
  159.     tilemap_mark_all_tiles_dirty(ch1a_tilemap);
  160. }
  161.  
  162. void taitol_chardef17_m(int offset)
  163. {
  164.     decodechar(Machine->gfx[2], offset/32+384, taitol_rambanks,
  165.                Machine->drv->gfxdecodeinfo[2].gfxlayout);
  166.     tilemap_mark_all_tiles_dirty(ch1a_tilemap);
  167. }
  168.  
  169. void taitol_chardef1c_m(int offset)
  170. {
  171.     decodechar(Machine->gfx[2], offset/32+512, taitol_rambanks + 0x4000,
  172.                Machine->drv->gfxdecodeinfo[2].gfxlayout);
  173.     tilemap_mark_all_tiles_dirty(ch1a_tilemap);
  174. }
  175.  
  176. void taitol_chardef1d_m(int offset)
  177. {
  178.     decodechar(Machine->gfx[2], offset/32+640, taitol_rambanks + 0x4000,
  179.                Machine->drv->gfxdecodeinfo[2].gfxlayout);
  180.     tilemap_mark_all_tiles_dirty(ch1a_tilemap);
  181. }
  182.  
  183. void taitol_chardef1e_m(int offset)
  184. {
  185.     decodechar(Machine->gfx[2], offset/32+768, taitol_rambanks + 0x4000,
  186.                Machine->drv->gfxdecodeinfo[2].gfxlayout);
  187.     tilemap_mark_all_tiles_dirty(ch1a_tilemap);
  188. }
  189.  
  190. void taitol_chardef1f_m(int offset)
  191. {
  192.     decodechar(Machine->gfx[2], offset/32+896, taitol_rambanks + 0x4000,
  193.                Machine->drv->gfxdecodeinfo[2].gfxlayout);
  194.     tilemap_mark_all_tiles_dirty(ch1a_tilemap);
  195. }
  196.  
  197. void taitol_bg18_m(int offset)
  198. {
  199.     tilemap_mark_tile_dirty(bg18_tilemap,offset/2);
  200. }
  201.  
  202. void taitol_bg19_m(int offset)
  203. {
  204.     tilemap_mark_tile_dirty(bg19_tilemap,offset/2);
  205. }
  206.  
  207. void taitol_char1a_m(int offset)
  208. {
  209.     tilemap_mark_tile_dirty(ch1a_tilemap,offset/2);
  210. }
  211.  
  212. void taitol_obj1b_m(int offset)
  213. {
  214.     if (offset>=0x3f0 && offset<=0x3ff)
  215.     {
  216.         switch(offset & 0xf)
  217.         {
  218.             case 0x4:
  219.             case 0x5:
  220.             {
  221.                 int dx = taitol_rambanks[0x73f4]|(taitol_rambanks[0x73f5]<<8);
  222.                 tilemap_set_scrollx(bg18_tilemap, 0, taitol_bg18_deltax - dx);
  223.                 break;
  224.             }
  225.             case 0x6:
  226.             {
  227.                 int dy = taitol_rambanks[0x73f6];
  228.                 tilemap_set_scrolly(bg18_tilemap, 0, -dy);
  229.                 break;
  230.             }
  231.             case 0xc:
  232.             case 0xd:
  233.             {
  234.                 int dx = taitol_rambanks[0x73fc]|(taitol_rambanks[0x73fd]<<8);
  235.                 tilemap_set_scrollx(bg19_tilemap, 0, taitol_bg19_deltax - dx);
  236.                 break;
  237.             }
  238.             case 0xe:
  239.             {
  240.                 int dy = taitol_rambanks[0x73fe];
  241.                 tilemap_set_scrolly(bg19_tilemap, 0, -dy);
  242.                 break;
  243.             }
  244.         }
  245.     }
  246. }
  247.  
  248.  
  249.  
  250. /***************************************************************************
  251.  
  252.   Display refresh
  253.  
  254. ***************************************************************************/
  255.  
  256. static void draw_sprites(struct osd_bitmap *bitmap)
  257. {
  258.     int offs;
  259.  
  260.  
  261.     spriteram = taitol_rambanks + 0x7000;
  262.     spriteram_size = 0x3f0;
  263.  
  264.     for (offs = spriteram_size-8;offs >= 0;offs -= 8)
  265.     {
  266.         int code,color,sx,sy,flipx,flipy;
  267.  
  268.         color = spriteram[offs + 2] & 0x0f;
  269.         code = spriteram[offs] | (spriteram[offs + 1] << 8);
  270.         sx = spriteram[offs + 4] | (spriteram[offs + 5] << 8);
  271.         sy = spriteram[offs + 6] | (spriteram[offs + 7] << 8);
  272.         flipx = spriteram[offs + 3] & 0x01;
  273.         flipy = spriteram[offs + 3] & 0x02;
  274.  
  275.         drawgfx(bitmap,Machine->gfx[1],
  276.                 code,
  277.                 color,
  278.                 flipx,flipy,
  279.                 sx,sy,
  280.                 &Machine->drv->visible_area,TRANSPARENCY_PEN,0);
  281.     }
  282. }
  283.  
  284.  
  285. void taitol_vh_screenrefresh(struct osd_bitmap *bitmap, int full_refresh)
  286. {
  287.     tilemap_update(ALL_TILEMAPS);
  288.  
  289.     if (palette_recalc())
  290.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  291.  
  292.     tilemap_render(ALL_TILEMAPS);
  293.  
  294.     tilemap_draw(bitmap,bg19_tilemap,0);
  295.     tilemap_draw(bitmap,bg18_tilemap,0);
  296.     tilemap_draw(bitmap,ch1a_tilemap,0);
  297.  
  298.     draw_sprites(bitmap);
  299. }
  300.